<?php
class UsuariosController extends AppController {

	var $name = 'Usuarios';
	var $helpers = array('Html', 'Form', 'Session');
	
		/* Relacionado com autenticação */
	
	function login() {
		
	}
	
	function logout() {
		$this->Session->setFlash(__('Você foi desconectado de sua sessão', true));
		$this->redirect($this->Auth->logout());
	}

	function perfil() {
		$usuario_id = $this->Auth->user('id');
		if (!$usuario_id) {
			$this->Session->setFlash(__('Voce não esta logado', true));
			$this->redirect(array('action' => 'index'));
		}
		$invite = $this->Usuario->invites($usuario_id);
		$amigos = $this->Usuario->UsuariosAmigo->find('amigos', array('usuario' => $usuario_id));
		$this->set('invite', $invite);
		$this->set('usuario', $this->Usuario->read(null, $usuario_id));
		$this->set('amigos', $amigos);
	}

	function amigos() {
		$this->paginate = array(
			'UsuariosAmigo' => array('amigos', 'usuario' => $this->Auth->user('id'))
		);
		$this->set('amigos', $this->paginate('UsuariosAmigo'));
	}

	function mensagens($tipo = null) {
			
		$this->set('MensagensRecebidas',$this->paginate('Mensagem', array('Mensagem.amigo_id' => $this->Auth->user('id'))));
		$this->set('MensagensEnviadas',$this->paginate('Mensagem', array('Mensagem.usuario_id' => $this->Auth->user('id'))));
	}
	public function request_friendship($amigo_id) {
		//Se o usuário tentar se auto-adicionar, recebe uma mensagem de erro e é redirecionado para o perfil
		if($amigo_id == $this->Auth->user('id')){
			$this->Session->setFlash('Você não pode se adicionar como amigo!');
			$this->redirect(array('action' => 'perfil'));
		}			
		try {
			$result = $this->Usuario->addFriend($this->Auth->user('id'), $amigo_id);
			if ($result === true) {
				$this->Session->setFlash(__('Sua solicitação de amigo foi enviada com sucesso', true));
				
			} else {
				$this->Session->setFlash(__('Sua solicitação não foi enviada, tente novamente', true));
			}
		} catch (Exception $e) {
			$this->Session->setFlash($e->getMessage());
		}

		$this->redirect(array('action' => 'perfil'));
	}
	
	function accept_invite($amigo_id) {
		$usuario_id = $this->Auth->user('id');
		try {
			$result = $this->Usuario->acceptInvite($this->Auth->user('id'), $amigo_id);
			if ($result === true) {
				$this->Session->setFlash(__('Você adicionou um novo amigo', true));
			} else {
				$this->Session->setFlash(__('Sua solicitação não foi enviada, tente novamente', true));
			}
		} catch (Exception $e) {
			$this->Session->setFlash($e->getMessage());
		}

		$this->redirect(array('action' => 'perfil'));
    }

	//Função foi desativada para permitir que o convite rejeitado seja realizado novamente futuramente
/*	function reject_invite($amigo_id) {
		$usuario_id = $this->Auth->user('id');
		try {
			$result = $this->Usuario->acceptInvite($this->Auth->user('id'), $amigo_id, false);
			if ($result === true) {
				$this->Session->setFlash(__('Solicitação indeferida', true));
			} else {
				$this->Session->setFlash(__('Sua solicitação não foi enviada, tente novamente', true));
			}
		} catch (Exception $e) {
			$this->Session->setFlash($e->getMessage());
		}

		$this->redirect(array('action' => 'perfil'));
    }
*/

	function unregisterFriend($requestedFriend, $pending = FALSE){
		//Se passou $pendind, carrega o valor PENDING_ACCEPT para a query
		if($pending)
			$status = UsuariosAmigo::PENDING_ACCEPT;
		else
			$status = UsuariosAmigo::ACCEPTED_FRIENDSHIP;

		$conditions = array('OR' => array(
						array('AND' => array('amigo_id' => $requestedFriend,
											 'usuario_id' => $this->Auth->user('id'),
											 'status' => $status)),
						array('AND' => array('amigo_id' => $this->Auth->user('id'),
											 'usuario_id' => $requestedFriend,
											 'status' => $status))
		));
		$retorno = $this->Usuario->UsuariosAmigo->find('first', compact('conditions') + array('fields' => array('id')));
		if ($retorno) {
		  	$this->Usuario->UsuariosAmigo->delete($retorno['UsuariosAmigo']['id']);
			if($pending)
				$this->Session->setFlash('Solicitação de amigo indeferida.');
			else
				$this->Session->setFlash('Usuário removido da lista de amigos.');
			$this->redirect(array('action' => 'perfil'));
		} else{
			$this->Session->setFlash('Não foi possível remover o usuário de sua lista de amigos.');
			$this->redirect(array('action' => 'perfil'));
		}
	}

	function blockFriend($requestedFriend){
		$conditions = array('OR' => array(
						array('AND' => array('amigo_id' => $requestedFriend,
											 'usuario_id' => $this->Auth->user('id'),
											 'status' => UsuariosAmigo::PENDING_ACCEPT)),
						array('AND' => array('amigo_id' => $this->Auth->user('id'),
											 'usuario_id' => $requestedFriend,
											 'status' => UsuariosAmigo::ACCEPTED_FRIENDSHIP))
		));
		$retorno = $this->Usuario->UsuariosAmigo->find('first', compact('conditions') + array('fields' => array('id')));
		if($retorno){
			//Testa se o ID do usuário que está solicitando o bloqueio é o usuario_id e não o amigo_id. Convenção chamada (haveUnblockPermission)
			if($this->Usuario->haveUnblockPermission($requestedFriend, $this->Auth->user('id'))){
				$this->Usuario->UsuariosAmigo->id = $retorno['UsuariosAmigo']['id'];
				$this->Usuario->UsuariosAmigo->saveField('status', UsuariosAmigo::REJECTED);
			} else {
				$this->Usuario->UsuariosAmigo->delete($retorno['UsuariosAmigo']['id']);
				$this->Usuario->UsuariosAmigo->save(array('usuario_id' => $this->Auth->user('id'), 'amigo_id' => $requestedFriend, 'status' => UsuariosAmigo::REJECTED));
			}
		} else{
			$this->Usuario->UsuariosAmigo->save(array('usuario_id' => $this->Auth->user('id'), 'amigo_id' => $requestedFriend, 'status' => UsuariosAmigo::REJECTED));
		}
		$this->Session->setFlash('Usuário bloqueado com sucesso.');
		$this->redirect(array('action' => 'perfil'));
	}
	
	function unblockFriend($requestedFriend){
		$retorno = $this->Usuario->haveUnblockPermission($requestedFriend, $this->Auth->user('id'));
		if($retorno){
			$this->Usuario->UsuariosAmigo->delete($retorno['UsuariosAmigo']['id']);
			$this->Session->setFlash('Usuário desbloqueado!');
		} else{
			$this->Session->setFlash('Não foi possível realizar o desbloqueio do usuário selecionado.');
		}
		$this->redirect(array('action' => 'perfil'));
	}
	
	function index() {
		
		$this->Usuario->recursive = 0;
		$this->set('usuarios', $this->paginate());
	}

	function view($id = null) {
		$this->Usuario->recursive = 1;
		if (!$id) {
			$this->Session->setFlash(__('Invalid usuario', true));
			$this->redirect(array('action' => 'index'));
		}
		//Se o usuário digitar o endereço /view/$id e for ele mesmo, redireciona para o perfil
		if($id == $this->Auth->user('id'))
			$this->redirect(array('action' => 'perfil'));
		$isFriend = $this->Usuario->isFriend($this->Auth->user('id'), $this->Usuario->id, true);
		$unblockPermission = $this->Usuario->haveUnblockPermission($id, $this->Auth->user('id'));
		$this->set(compact('isFriend', 'unblockPermission'));
		$this->set('usuario', $this->Usuario->read(null, $id));
	}

	function add() {
		if (array_key_exists('cancel', $this->params['form'])) {
			$this->Session->setFlash(__('Cadastro de usuário cancelado.', true));
			$this->redirect(array('action' => 'index'));
		} else {
			if (!empty($this->data)) {
					/* Criptografa a senha para incluir no BD */
					$this->data['Usuario']['senha'] = $this->Auth->password($this->data['Usuario']['senha_clear']);
					
					if(isset($this->data['Usuario']['senha2']))
						$this->data['Usuario']['senha2hashed'] = $this->Auth->password($this->data['Usuario']['senha2']);
					$this->Usuario->create();
					if($this->Usuario->save($this->data)) {
						$this->Session->setFlash(__('O usuário foi salvo. Verifique seus emails para ativar a conta.', true));
						$this->redirect(array('action' => 'index'));
					} else {
						$this->Session->setFlash(__('Não foi possível cadastrar o usuário', true));
					}
			}
		}
		$amigos = $this->Usuario->Amigo->find('list');
		$this->set(compact('amigos'));
	}

	function edit($id = null) {
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid usuario', true));
			$this->redirect(array('action' => 'index'));
		}
		if (!empty($this->data)) {
				/* Criptografa a senha atual fornecida pelo usuário*/
				if(!empty($this->data['Usuario']['senha_informada'])){
					$this->data['Usuario']['senha_informada_hashed'] = $this->Auth->password($this->data['Usuario']['senha_informada']);
					
					//Guarda a senha resgatada do banco caso o usuário erre algum campo e repita do processo
					if(isset($this->data['Usuario']['senha']))
						$this->data['Usuario']['senha_anterior'] = $this->data['Usuario']['senha'];
					else
						$this->data['Usuario']['senha'] = $this->data['Usuario']['senha_anterior'];
					
					/* Criptografa a senha nova e a confirmação*/
					if(isset($this->data['Usuario']['senha2']) || isset($this->data['Usuario']['senha_clear'])){
						$this->data['Usuario']['senhahashed'] = $this->Auth->password($this->data['Usuario']['senha_clear']);
						$this->data['Usuario']['senha2hashed'] = $this->Auth->password($this->data['Usuario']['senha2']);
						//Carrega a variável que será armazenada no DB caso o VALIDATE deixar passar
						$this->data['Usuario']['senha'] = $this->data['Usuario']['senhahashed'];
					}
				} else{
					// Limpa os campos de senha do $this->data para não existir intervenção do VALIDATE e não alterar o DB
					unset($this->data['Usuario']['senha_informada']);
					unset($this->data['Usuario']['senha_clear']);
					unset($this->data['Usuario']['senha2']);
				}
				
				if ($this->Usuario->save($this->data)) {
					$this->Session->setFlash(__('O usuário foi salvo.', true));
					//$this->redirect(array('action'=>'index'));
				} else {
					$this->Session->setFlash(__('O usuário não pôde ser salvo. Por favor, tente novamente.', true));
				}
		}
		if (empty($this->data)) {
			$this->data = $this->Usuario->read(null, $id);
		}
		$amigos = $this->Usuario->Amigo->find('list');
		$this->set(compact('amigos'));
	}

	function delete($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid id for usuario', true));
			$this->redirect(array('action'=>'index'));
		}
		if ($this->Usuario->delete($id)) {
			$this->Session->setFlash(__('Usuario deleted', true));
			$this->redirect(array('action'=>'index'));
		}
		$this->Session->setFlash(__('Usuario was not deleted', true));
		$this->redirect(array('action' => 'index'));
	}
	function admin_index() {
		$this->Usuario->recursive = 0;
		$this->set('usuarios', $this->paginate());
	}

	function admin_view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid usuario', true));
			$this->redirect(array('action' => 'index'));
		}
		$this->set('usuario', $this->Usuario->read(null, $id));
	}

	function admin_add() {
		if (!empty($this->data)) {
			$this->Usuario->create();
			if ($this->Usuario->save($this->data)) {
				$this->Session->setFlash(__('The usuario has been saved', true));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('The usuario could not be saved. Please, try again.', true));
			}
		}
		$amigos = $this->Usuario->Amigo->find('list');
		$this->set(compact('amigos'));
	}

	function admin_edit($id = null) {
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid usuario', true));
			$this->redirect(array('action' => 'index'));
		}
		if (!empty($this->data)) {
			if ($this->Usuario->save($this->data)) {
				$this->Session->setFlash(__('The usuario has been saved', true));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('The usuario could not be saved. Please, try again.', true));
			}
		}
		if (empty($this->data)) {
			$this->data = $this->Usuario->read(null, $id);
		}
		$amigos = $this->Usuario->Amigo->find('list');
		$this->set(compact('amigos'));
	}

	function admin_delete($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid id for usuario', true));
			$this->redirect(array('action'=>'index'));
		}
		if ($this->Usuario->delete($id)) {
			$this->Session->setFlash(__('Usuario deleted', true));
			$this->redirect(array('action'=>'index'));
		}
		$this->Session->setFlash(__('Usuario was not deleted', true));
		$this->redirect(array('action' => 'index'));
	}
}
?>